﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using Entidades;
using LogicaNegocio;
using AccesoBD;

namespace PresentacionEscritorio
{
    public partial class frmRegistrarEspecialidadPorMedico : Form, IOpcion, IFormsPadre_Hijo
    {
        GestorEspecialidadXMedico GEM;
        GestorMedicos GM;
        GestorEspecialdiad GE;


        private string opElegida;
        //public EspecialidadMedico EspXMedSeleccionadaDeGrilla { get; set; }
        private EspecialidadMedico EspXMedSeleccionadaDeGrilla;
        public Medico MiMedicoRecibido { get; set; }
        private frmAgregarEspecialidadAMedico formAgregarEsp;
        private frmModificarMatriculaAMedico formModificarMat;
        private frmRegistrarHorarioMedico formHorariosMed;
        private long legajoMedEsp; //sirve para saber con que medico estoy trabajando

        enum estadoMedico
        {
            Encontrado,
            NoEncontrado,
        }
        enum estadoGrilla
        {
            seleccionando,
            filtrando
        }
        enum EstadoForm
        {
            insertar,
            modificar,
            eliminar,
        }

        EstadoForm accion = EstadoForm.insertar;
        estadoMedico oEM = estadoMedico.NoEncontrado;
        estadoGrilla oEG = estadoGrilla.filtrando;

        public frmRegistrarEspecialidadPorMedico()
        {
            InitializeComponent();
        }

        private void frmRegistrarEspecialidadPorMedico_Load(object sender, EventArgs e)
        {
            btnModificarMatricula.Enabled = false;
            btnEliminarEspecialidad.Enabled = false;
            btnAgregarHorarioAtencion.Enabled = false;
            opElegida = Opcion.OpConsultar;
            cargarFormSegunOpcion();
        }

        private void cargarFormSegunOpcion()
        {
            switch (opElegida)
            {
                case Opcion.OpConsultar:
                    this.Text = "Consultar Especialidades por Médico - TodoSalud";
                    lblTitulo.Text = "Consultar Especialidades por médico";
                    cargarGrillaMedicos();
                    break;
                case Opcion.OpRegistrar:
                    this.Text = "Registrar Especialidades a Médico - TodoSalud";
                    lblTitulo.Text = "Registrar Especialidades a médico";
                    panelBusquedaMedico.Enabled = false;
                    cargarNombreMedico(MiMedicoRecibido.Sexo.Nombre, MiMedicoRecibido.Nombre, MiMedicoRecibido.Legajo);
                    legajoMedEsp = MiMedicoRecibido.Legajo;
                    //no tiene especialidades, asi que no le cargamos la grilla de especialidades xD
                    break;
            }
        }

        private void cargarNombreMedico(string sexo, string nombre, long legajo)
        {
            if (sexo == Sexo.Femenino)
                lblNombreMedico.Text = "Especialidades de Dra. " + nombre + " - legajo: " + legajo;
            else
                lblNombreMedico.Text = "Especialidades de Dr. " + nombre + " - legajo: " + legajo;
        }

        private void cargarGrillaMedicos()
        {
            GM = new GestorMedicos();
            List<Medico> lstMedico = GM.ObtenerMedicosNombres();
            if (lstMedico != null)
            {
                int i = -1;
                foreach (Medico item in lstMedico)
                {
                    i = dgvMedicos.Rows.Add();
                    dgvMedicos.Rows[i].Cells["Legajo"].Value = item.Legajo;
                    dgvMedicos.Rows[i].Cells["Nombre"].Value = item.ApellidoNombre;
                    dgvMedicos.Rows[i].Cells["Matricula"].Value = item.NroMatricula;

                    //columna invisible
                    dgvMedicos.Rows[i].Cells["NombreSexo"].Value = item.Sexo.Nombre;
                }
            }
            else
            {
                MessageBox.Show("Actualmente no hay medicos registrados en el sistema", "Informacion", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }



        }

        public void asignarEspecialidadAMedico(string nombreEspecialidad, long matriculaEspecialidad, int codigoEspecialidad)
        {
            Especialidad oE = new Especialidad();
            oE.Nombre = nombreEspecialidad;
        }

        private void btnBusquedaMedico_Click(object sender, EventArgs e)
        {

        }

        private void btnAgregarEspecialidad_Click(object sender, EventArgs e)
        {
            frmAgregarEspecialidadAMedico frm2 = new frmAgregarEspecialidadAMedico();
            frm2.LegajoMed = legajoMedEsp;
            frm2.setFormPadre(this);
            frm2.ShowDialog(this);
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            DialogResult dialogResult = MessageBox.Show("¿Está seguro que desea salr?", "Salir", MessageBoxButtons.YesNo);
            if (dialogResult == DialogResult.Yes)
            {
                this.Close();
            }
        }

        private void dgvEspecialidadxMedico_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (dgvEspecialidadxMedico.Columns[e.ColumnIndex].HeaderText.ToString().Equals("Seleccionar"))
            {
                obtenerEspecialidadSeleccionada(e.RowIndex);

                btnModificarMatricula.Enabled = true;
                btnEliminarEspecialidad.Enabled = true;
                btnAgregarHorarioAtencion.Enabled = true;
            }
            else
            {
                btnModificarMatricula.Enabled = false;
                btnEliminarEspecialidad.Enabled = false;
                btnAgregarHorarioAtencion.Enabled = false;
            }
        }

        private void obtenerEspecialidadSeleccionada(int nroFilaGrid)
        {
            if (EspXMedSeleccionadaDeGrilla == null)
                EspXMedSeleccionadaDeGrilla = new EspecialidadMedico();
            EspXMedSeleccionadaDeGrilla.CodEspecialidad = int.Parse(dgvEspecialidadxMedico.Rows[nroFilaGrid].Cells["CodEspecialidad"].Value.ToString());
            EspXMedSeleccionadaDeGrilla.LegajoMedico = long.Parse(dgvEspecialidadxMedico.Rows[nroFilaGrid].Cells["LegajoMed"].Value.ToString());
            EspXMedSeleccionadaDeGrilla.Especialidad = new Especialidad();
            EspXMedSeleccionadaDeGrilla.Especialidad.Nombre = dgvEspecialidadxMedico.Rows[nroFilaGrid].Cells["Especialidad"].Value.ToString();
            EspXMedSeleccionadaDeGrilla.NumeroMatriculaEspecialidad = long.Parse(dgvEspecialidadxMedico.Rows[nroFilaGrid].Cells["MatriculaEsp"].Value.ToString());
            EspXMedSeleccionadaDeGrilla.TieneHorario = bool.Parse(dgvEspecialidadxMedico.Rows[nroFilaGrid].Cells["TieneHorario"].Value.ToString());
        }

        private void dgvMedicos_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (dgvMedicos.Columns[e.ColumnIndex].HeaderText == "Seleccionar")
            {
                string sexo = dgvMedicos.CurrentRow.Cells["NombreSexo"].Value.ToString();
                string nombre = dgvMedicos.CurrentRow.Cells["Nombre"].Value.ToString();
                legajoMedEsp = long.Parse(dgvMedicos.CurrentRow.Cells["Legajo"].Value.ToString());
                cargarNombreMedico(sexo, nombre, legajoMedEsp);

                bool res = cargarGrillaEspecialidadesMedico(legajoMedEsp);
                if (res)  //si ya tiene especialidades debo poder darle las otras 3 opciones
                {
                    btnModificarMatricula.Enabled = true;
                    btnEliminarEspecialidad.Enabled = true;
                    btnAgregarHorarioAtencion.Enabled = true;
                }
            }
        }

        //el bool me indica si tiene especialidades o no
        private bool cargarGrillaEspecialidadesMedico(long legajoMed)
        {
            bool tieneEspecialidades = false;

            //limpiamos la grilla si esta cargada
            if (dgvEspecialidadxMedico.RowCount > 0)
                dgvEspecialidadxMedico.Rows.Clear();

            List<EspecialidadMedico> list = GM.ObtenerEspecialidadesVigentesMedico(legajoMed);
            if (list != null)
            {
                int i = -1;
                foreach (EspecialidadMedico item in list)
                {
                    i = dgvEspecialidadxMedico.Rows.Add();
                    dgvEspecialidadxMedico.Rows[i].Cells["Especialidad"].Value = item.Especialidad.Nombre;
                    dgvEspecialidadxMedico.Rows[i].Cells["MatriculaEsp"].Value = item.NumeroMatriculaEspecialidad;
                    dgvEspecialidadxMedico.Rows[i].Cells["TieneHorario"].Value = item.TieneHorario;

                    //columnas no visibles
                    dgvEspecialidadxMedico.Rows[i].Cells["CodEspecialidad"].Value = item.CodEspecialidad;
                    dgvEspecialidadxMedico.Rows[i].Cells["LegajoMed"].Value = item.LegajoMedico;
                }
                tieneEspecialidades = true;
            }
            return tieneEspecialidades;
        }

        private void limpiar()
        {
            dgvEspecialidadxMedico.Rows.Clear();
            txtApellido.Text = "";
            txtLegajoMedico.Text = "";
            txtNumeroMatricula.Text = "";
        }

        private void btnNuevo_Click(object sender, EventArgs e)
        {
            limpiar();
        }

        private void btnModificarMatricula_Click(object sender, EventArgs e)
        {
            //cargamos el nombre del medico en el objeto espXmed seleccionada
            if (EspXMedSeleccionadaDeGrilla.Medico == null)
                EspXMedSeleccionadaDeGrilla.Medico = new Medico();
            GestorMedicos gm = new GestorMedicos();
            EspXMedSeleccionadaDeGrilla.Medico.ApellidoNombre = gm.obtenerNombreMedico(EspXMedSeleccionadaDeGrilla.LegajoMedico);


            frmModificarMatriculaAMedico frmMM = new frmModificarMatriculaAMedico();
            frmMM.EspRecibida = EspXMedSeleccionadaDeGrilla;
            frmMM.setFormPadre(this);
            frmMM.Show();
        }


        private void btnEliminarEspecialidad_Click(object sender, EventArgs e)
        {
            DialogResult dr = MessageBox.Show("¿Esta seguro que desea eliminar la especialidad?", "Informacion", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

            if (dr == DialogResult.Yes)
            {
                DateTime fechaBajaEsp = DateTime.Now;
                GestorMedicos gm = new GestorMedicos();
                DateTime? fechaUltTurno;
                bool res = gm.eliminarEspecialidadAMedico(EspXMedSeleccionadaDeGrilla, fechaBajaEsp, out fechaUltTurno);
                if (res)
                    MessageBox.Show("Se ha dado de baja la especialidad exitosamente", "Información", MessageBoxButtons.OK);
                else
                {
                    if (fechaUltTurno != null)
                        MessageBox.Show("No se puede dar de baja a la especialidad, dado que tiene turno asignado hasta el " + fechaUltTurno, "Error", MessageBoxButtons.OKCancel);
                    else
                        MessageBox.Show("No se puede dar de baja a la especialidad", "Error", MessageBoxButtons.OKCancel);
                }

            }

        }


        public void actualizarCambios()
        {
            bool res = cargarGrillaEspecialidadesMedico(legajoMedEsp);
            if (res)  //si ya tiene especialidades debo poder darle las otras 3 opciones
            {
                btnModificarMatricula.Enabled = true;
                btnEliminarEspecialidad.Enabled = true;
                btnAgregarHorarioAtencion.Enabled = true;
            }
        }

        public void setOpcion(string op)
        {
            opElegida = op;
        }

        public string getOpcion()
        {
            return opElegida;
        }

        public List<Especialidad> filtrarGrillaEspecialidadSeleccionada()
        {
            throw new NotImplementedException();
        }


        public Medico ObtenerMedico()
        {
            throw new NotImplementedException();
        }

        private void btnAgregarHorarioAtencion_Click(object sender, EventArgs e)
        {
            frmRegistrarHorarioMedico formHorarioMed = new frmRegistrarHorarioMedico();
            formHorarioMed.MiEspecialidadMedico = EspXMedSeleccionadaDeGrilla;
            formHorarioMed.setFormPadre(this);
            formHorarioMed.ShowDialog(this);
        }


        public void setFormPadre(Form formPadre)
        {
            throw new NotImplementedException();
        }

        public void setFormHijo(Form formHijo)
        {
            if (formHijo.GetType() == typeof(frmAgregarEspecialidadAMedico))
                formAgregarEsp = (frmAgregarEspecialidadAMedico)formHijo;

            else if (formHijo.GetType() == typeof(frmModificarMatriculaAMedico))
                formModificarMat = (frmModificarMatriculaAMedico)formHijo;

            else if (formHijo.GetType() == typeof(frmRegistrarHorarioMedico))
                formHorariosMed = (frmRegistrarHorarioMedico)formHijo;
        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            this.Dispose();
        }
    }

}
